/************************************************************************************
**  
* @copyright (c) 2013-2100,  Technology Co., LTD. All Right Reserved.
*
*************************************************************************************/
/**
* @file	    duye_inotify.h
* @version     
* @brief      
* @author
* @date     2013-03-30
* @note 
*
*  1. 2013-03-30 Created this file
* 
*/
#pragma once

#include <sys/inotify.h>
#include <duye_sys.h>
#include <duye_type.h>

namespace duye {

/** 
 * shared GLibrary wrapper
 */
class Inotify {
public:
    Inotify();
    ~Inotify();

    /**
     * @brief init
     * @return on success, return watch fd. on error, return -1
     */		
    int32 init();

    /**
     * @brief add monitor file/directory
     * @param [in] path : file or directory path
     * @param [in] mask : all IN_ACCESS|IN_ATTRIB|IN_CLOSE_WRITE|IN_CLOSE_NOWRITE|IN_CREATE|IN_DELETE|IN_DELETE_SELF|IN_MODIFY|IN_MOVE_SELF|IN_MOVED_FROM|IN_MOVED_TO|IN_OPEN
        设置值
        IN_ALL_EVENTS           所有事件监控，默认值
        IN_ONESHOT              返回一次事件，然后移除监控列表
            
        返回和设置值
        IN_ACCESS               文件被访问
        IN_ATTRIB               文件属性被修改（比如，权限，所有权，链接计数，扩展属性，用户ID，或组ID等, chmod、chown、touch）
        IN_CLOSE_WRITE          关闭为了写入而打开的文件, close
        IN_CLOSE_NOWRITE        关闭没有写入而打开的文件
        IN_CREATE               在受监控目录下创建了文件或目录
        IN_DELETE               在受监控目录内删除了文件或目录, rm
        IN_DELETE_SELF          自删除，即一个可执行文件在执行时删除自己
        IN_MODIFY               文件被修改
        IN_MOVE_SELF            自移动，即一个可执行文件在执行时移动自己
        IN_MOVED_FROM           文件被移走, 如mv
        IN_MOVED_TO             文件被移来，如mv、cp
        IN_OPEN                 文件被打开
        IN_UNMOUNT              宿主文件系统被 umount
        IN_MORE_SELF            重命名对象时会发生事件

        组合掩码
        IN_MOVE                 IN_MOVED_FROM|IN_MOVED_TO
        IN_CLOSE                IN_CLOSE_WRITE|IN_CLOSE_NOWRITE
     * @return on success, return wd. on error, return -1
     */
    int32 addWatch(const int8* path, const uint32 mask = IN_ALL_EVENTS);

    /**
     * @brief remove monitor file/directory
     * @param [in] wd : watch descriptor, by addWatch() return
     * @return true/false
     */
    bool delWatch(const int32 wd);

private:
    int32 m_fd;
};

}
